package ChainArriere;

import java.util.Vector;


/* La classe definissant les regles d'inferences */

class Regle {

	/* Partie statique gardant la liste des elements */
	static Vector liste;
	static public Vector getListe() {
		if (liste == null) liste = new Vector();
		return liste;
	}


	/* Partie dynamique */

	private Vector premices;		// Contiendra la partie gauche du =>
	private Fait conclusion;		// Contiendra la partie droite du =>

	// Le constructeur
	public Regle(String texte) {

		// Initialisation ...
		premices = new Vector();

		// On separe le texte en deux au niveau de l'implication
		String[] couple = texte.split(" => ");

		// On separe les faits de liste des premices
		String[] premices = couple[0].split(" ET ");

		// On stocke les premices	
		for (int i = 0; i < premices.length; i++)
			addPremice(Fait.creer(premices[i]));

		// On stocke la conclusion
		setConclusion(Fait.creer(couple[1]));

	}

	// Methodes aidant la construction
	private void setConclusion(Fait fait) 
	{	
		conclusion = fait;			
	}

	private void addPremice(Fait fait)
	{
		premices.add(fait);
	}

	// Methodes d'acces
	public Vector getPremices()
	{
		return premices;
	}

	public Fait getConclusion()
	{
		return conclusion;
	}

	// Methode d'analyse d'inferabilite
	/* Verifiera si la regle peut maintenant determiner un fait,
	   retourne vrai si on a pu inferer quelque chose de NOUVEAU. */
	public boolean go()
	{
				
		// Si on avait deja conclu, on ne trouvera rien de neuf
		if (conclusion.ok()) 
			return false;
		
		// On verifie si on a toutes les premices pour conclure
		for (int i = 0, max = premices.size(); i < max; i++)
		{
			Fait temp = (Fait) premices.get(i);
			
			if (!((Fait) premices.get(i)).ok())
				return false;
		}

			
		// On verifie si on a la conjonction complete
		for (int i = 0, max = premices.size(); i < max; i++)
			if (!((Fait) premices.get(i)).get()) 
			{
				conclusion.set(false, this);
				return true;		
			}
	
		// On conclu positivement
		conclusion.set(true, this);
		return true;
	}

	// toString
	public String toString() {
		String txt = "";
		int max = premices.size();

		for (int i = 0; i < max-1; i++)
			txt += (Fait) premices.get(i) + " ET ";

		txt += (Fait) premices.get(max-1) + " => " + conclusion;

		return txt;
	}

}


